#ifndef SECURETOKENMANAGER_H
#define SECURETOKENMANAGER_H

#include <QString>
#include <QByteArray>
#include <QCryptographicHash>
#include <QUuid>
#include <QDateTime>
#include <QRandomGenerator>
#include <QDebug>

#ifdef _WIN32
#include <windows.h>
#include <intrin.h>
#elif __APPLE__
#include <sys/sysctl.h>
#include <mach/mach.h>
#include <mach/processor_info.h>
#include <CoreFoundation/CoreFoundation.h>
#include <IOKit/IOKitLib.h>
#elif __linux__
#include <sys/utsname.h>
#include <unistd.h>
#include <fcntl.h>
#include <cstring>
#endif

// 安全Token结构（JSON格式）
struct SecureTokenData {
    QString version;        // Token版本
    QString encryptedData;  // 加密的Token数据
    QString nonce;         // GCM nonce
    QString salt;          // 密钥派生salt
    QString hash;          // 完整性校验hash
    qint64 timestamp;      // 创建时间戳
    qint64 expiresAt;      // 过期时间
    int failedAttempts;    // 失败尝试次数

    // 序列化到JSON
    QJsonObject toJson() const;

    // 从JSON反序列化
    static SecureTokenData fromJson(const QJsonObject& json);

    // 验证数据完整性
    bool isValid() const;
};

/**
 * @brief 安全Token管理器
 *
 * 提供硬件绑定的Token加密存储功能：
 * - AES-256-GCM加密算法
 * - 硬件特征绑定密钥派生
 * - Token有效期验证
 * - 防重放攻击保护
 * - 安全密钥轮换机制
 */
class SecureTokenManager
{
public:
    explicit SecureTokenManager();
    ~SecureTokenManager();

    // 单例模式
    static SecureTokenManager& instance();

    // Token加密存储
    QString encryptAndStoreToken(const QString& token, const QString& email = QString());
    QString loadAndDecryptToken(const QString& email = QString());
    void clearStoredToken(const QString& email = QString());

    // Token验证
    bool isTokenValid(const QString& encryptedToken);
    bool isTokenExpired(const QString& encryptedToken);
    bool isTokenExpired(const SecureTokenData& tokenData);
    qint64 getTokenRemainingTime(const QString& encryptedToken);

    // 密钥管理
    void rotateEncryptionKey();
    bool needsKeyRotation();

    // 安全功能
    QString generateSecureNonce();
    bool verifyTokenIntegrity(const QString& encryptedToken, const QString& expectedHash);

    // 配置选项
    void setTokenExpirationHours(int hours);
    void setMaxFailedAttempts(int attempts);
    bool isTokenLocked(const QString& email);

  // 硬件指纹访问（供其他模块使用）
  QString getHardwareFingerprint() const;

private:
    // 硬件特征收集
    QString collectHardwareFingerprint();
    QString getMotherboardSerial();
    QString getCpuId();
    QString getMacAddress();
    QString getVolumeSerial();

    // 密钥派生
    QByteArray deriveKeyFromHardware(const QString& salt = QString());
    QString generateSalt();
    QString getSecureSalt();

    // 加密/解密
    QByteArray encryptAES256GCM(const QByteArray& data, const QByteArray& key, const QByteArray& nonce);
    QByteArray decryptAES256GCM(const QByteArray& encryptedData, const QByteArray& key, const QByteArray& nonce);

    // 辅助方法
    QByteArray generateIV();
    QString calculateTokenHash(const QString& token, const QString& salt);
    QByteArray encodeBase64Safe(const QByteArray& data);
    QByteArray decodeBase64Safe(const QString& data);

    // 失败计数管理
    void recordFailedAttempt(const QString& email);
    void clearFailedAttempts(const QString& email);
    int getFailedAttempts(const QString& email);

private:
    static SecureTokenManager* s_instance;

    // 配置参数
    int m_tokenExpirationHours;
    int m_maxFailedAttempts;

    // 缓存数据
    QString m_cachedHardwareId;
    QByteArray m_currentEncryptionKey;
    QDateTime m_keyGenerationTime;

    // 常量定义
    static const int KEY_ROTATION_DAYS = 30;
    static const int TOKEN_LENGTH = 32;
    static const int NONCE_LENGTH = 12;
    static const int TAG_LENGTH = 16;
    static const int SALT_LENGTH = 32;
    static const QString TOKEN_VERSION;
    static const QString FAILED_ATTEMPT_KEY_PREFIX;
};

#endif // SECURETOKENMANAGER_H